<?php 

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# Ce fichier a été créé le 1 septembre 2010 et est inspiré
# de Clearbricks.
#
# Note de licence de Clearbricks:
# Copyright (c) 2003-2010 Olivier Meunier & Association Dotclear
# Clearbricks est distribué selon les termes de la licence GPL
# version 2.0.
#
# -- FIN NOTE DE LICENCE ---------------------------------------

/**
* Permet d'associer une classe et ses méthodes à un
* résulat de la base de données.
*
* @package ClearbricksMod
* @subpackage DBLayer
*/
class cpStaticRecord
{
	
	/** @var integer	Rangée de données actuelle */
	protected $__index = 0;
	
	/** @var array		Objets associés aux données */
	public $__objets = array();
	
	private $__fetch = false;
	
	/**
	* Constructeur
	*
	* Crée un tableau d'objets à partir d'un recordset.
	*
	* @param recordset	$rs			Résultat de la base de données
	*/
	public function __construct($rs, $nomClasse, $core, $extra=null)
	{

		if(is_array($rs)) {
			$this->__objets = $rs;	
		} else {
			while($rs->fetch()) {
				$this->__objets[] = new $nomClasse($rs, $core, $extra);
			}
			unset($rs);
		}
		
		$this->index(0);
	}
	
	
	
	/**
	* Surcharge call
	*
	* Méthode de surcharge call. Appelle une fonction de l'objet associée à la
	* rangée de donnée actuelle.
	*
	* @return mixed
	*/
	public function __call($f,$args)
	{
		return call_user_func_array(array($this->__objets[$this->__index], $f), $args);
	}
	
	/**
	* Surcharge get
	* 
	* @param string		$n		Nom de la propriété à retourner
	* @return mixed
	*/
	public function __get($n)
	{
		return $this->__objets[$this->__index]->$n;
	}
	
	
	/**
	* Surcharge set
	* 
	* @param string	$n		Nom de la propriété à définir
	* @param string	$v		Valeur de la propriété à définir
	* @return mixed
	*/
	public function __set($n, $v)
	{
		return $this->__objets[$this->__index]->$n;
	}
	
	
	/**
	* 
	* Retourne le numéro de la rangée de données actuelle (0 pour la première
	* rangée) ou se déplace à la rangée <var>$rangee</var> si elle est
	* spécifiée.
	*
	* @param integer	$rangee			Rangée à atteindre
	* @return integer
	*/
	public function index($rangee=null)
	{
		if ($rangee === null) {
			return $this->__index;
		}
		
		if ($rangee < 0 || $rangee+1 > $this->count()) {
			return false;
		}
		
		$this->__index = $rangee;
		return true;
	}
	
	/**
	* 
	* Avancer l'index pas à pas
	*
	* Cette méthode augmente l'index d'une position et retourne
	* true tant que la dernière rangée n'est pas atteinte.
	* 
	* Utile pour créer une boucle qui lit chaque rangée. Exemple:
	* <code>
	* <?php
	* while ($rs->fetch()) {
	* 	echo $rs->field1;
	* }
	* ?>
	* </code>
	*
	* @return boolean
	*/
	public function fetch()
	{
		if (!$this->__fetch) {
			$this->__fetch = true;
			$i = -1;
		} else {
			$i = $this->__index;
		}
		
		if (!$this->index($i+1)) {
			$this->__fetch = false;
			$this->__index = 0;
			return false;
		}
		
		return true;
	}
	
	/**
	* Déplace l'index à la première rangée..
	*
	* @return boolean
	*/
	public function moveStart()
	{
		return $this->index(0);
	}
	
	/**
	* Déplace l'index à la dernière rangée.
	*
	* @return boolean
	*/
	public function moveEnd()
	{
		return $this->index(count($this->__objets)-1);
	}
	
	/**
	* Déplace l'index à la rangée suivante.
	*
	* @return boolean
	*/
	public function moveNext()
	{
		return $this->index($this->__index+1);
	}
	
	/**
	* Déplace l'index à la rangée précédente.
	*
	* @return boolean
	*/
	public function movePrev()
	{
		return $this->index($this->__index-1);
	}
	
	/**
	* @return boolean	true si l'index est à la dernière position
	*/
	public function isEnd()
	{
		return $this->__index+1 == $this->count();
	}
	
	/**
	* @return boolean	true si l'index est à la première position
	*/
	public function isStart()
	{
		return $this->__index <= 0;
	}
	
	/**
	* @return boolean	true si le record ne contient aucune résultat
	*/
	public function isEmpty()
	{
		return $this->count() == 0;
	}
	
	/**
	* @return integer	nombre de rangées dans le record
	*/
	public function count()
	{
		return count($this->__objets);
	}
	
	/**
	* @return object	objet de la rangée en cours
	*/
	public function objet()
	{
		return $this->__objets[$this->__index];
	}

}

?>